#!/bin/zsh

#=============================================================================
# 脚本名称: add_random_prefix.sh
# 功能描述: 为指定目录中的文件添加特殊格式的随机前缀
# 作者: Pedro.Pei
# 版本: 2.0
# 日期: 2024-12-20
#=============================================================================

# 功能说明:
# 本脚本用于为文件名添加特殊格式的前缀，格式为: PFX_时间戳_随机字符串_
# - 支持递归处理子文件夹
# - 智能检测并替换已有的前缀
# - 跳过隐藏文件和脚本自身
# - 提供详细的处理日志

# 前缀格式:
# PFX_YYYYMMDDHHMMSS_XXXXXXXX_
# - PFX: 固定标识符，用于区分本脚本生成的前缀
# - YYYYMMDDHHMMSS: 14位时间戳
# - XXXXXXXX: 8位随机字符串（十六进制或数字）

# 使用方法:
# ./add_random_prefix.sh <目标目录> [选项]
#
# 参数说明:
# <目标目录>     必需参数，指定要处理的目录路径
# --recursive   可选参数，启用递归模式处理子文件夹
# -r            --recursive 的简写形式

# 使用示例:
# ./add_random_prefix.sh /path/to/directory          # 仅处理指定目录
# ./add_random_prefix.sh /path/to/directory -r       # 递归处理所有子目录
# ./add_random_prefix.sh /path/to/directory --recursive

# 处理逻辑:
# 1. 检查文件是否已有本脚本生成的前缀
# 2. 如果有，先移除旧前缀，再添加新前缀
# 3. 如果没有，直接添加新前缀
# 4. 跳过隐藏文件（以.开头）和脚本自身

# 注意事项:
# - 脚本会直接修改文件名，建议先备份重要文件
# - 需要zsh环境支持
# - 依赖openssl命令生成随机字符串（如不可用则使用shuf命令）
# - 递归模式会处理所有子目录中的文件

#=============================================================================

# 检查是否提供了文件夹路径作为参数
if [ -z "$1" ]; then
  echo "Usage: $0 <folder_path> [--recursive|-r]"
  echo "Options:"
  echo "  --recursive, -r    递归处理子文件夹"
  exit 1
fi

# 解析命令行参数
RECURSIVE=false
TARGET_DIR="$1"

if [ "$2" = "--recursive" ] || [ "$2" = "-r" ]; then
  RECURSIVE=true
fi

# 确保提供的路径是有效的目录
if [ ! -d "$TARGET_DIR" ]; then
  echo "Error: $TARGET_DIR is not a valid directory."
  exit 1
fi

# 定义特殊前缀格式：PFX_时间戳_随机字符串_
# 使用PFX作为标识符，避免与其他文件冲突
generate_special_prefix() {
  local timestamp=$(date +%Y%m%d%H%M%S)
  local random_str=$(openssl rand -hex 4 2>/dev/null || echo $(shuf -i 1000-9999 -n 1))
  echo "PFX_${timestamp}_${random_str}_"
}

# 检查文件是否已有我们的特殊前缀
has_our_prefix() {
  local filename="$1"
  [[ "$filename" =~ ^PFX_[0-9]{14}_[a-f0-9]{8}_ ]] || [[ "$filename" =~ ^PFX_[0-9]{14}_[0-9]{4}_ ]]
}

# 移除已有的前缀
remove_existing_prefix() {
  local filename="$1"
  if has_our_prefix "$filename"; then
    # 移除PFX_时间戳_随机字符串_前缀
    echo "${filename#PFX_*_*_}"
  else
    echo "$filename"
  fi
}

# 处理单个文件的函数
process_file() {
  local file_path="$1"
  local filename=$(basename "$file_path")
  local dir_path=$(dirname "$file_path")
  
  # 跳过隐藏文件和脚本自身
  if [[ "$filename" == .* ]] || [[ "$filename" == "$(basename "$0")" ]]; then
    return
  fi
  
  # 移除已有的前缀（如果存在）
  local clean_name=$(remove_existing_prefix "$filename")
  
  # 生成新的特殊前缀
  local new_prefix=$(generate_special_prefix)
  local new_name="${new_prefix}${clean_name}"
  local new_path="${dir_path}/${new_name}"
  
  # 如果文件名没有变化，跳过
  if [[ "$filename" == "$new_name" ]]; then
    echo "Skipped: $file_path (no change needed)"
    return
  fi
  
  # 重命名文件
  if mv "$file_path" "$new_path"; then
    if has_our_prefix "$filename"; then
      echo "Updated: $file_path -> $new_path"
    else
      echo "Renamed: $file_path -> $new_path"
    fi
  else
    echo "Error: Failed to rename $file_path"
  fi
}

# 递归处理目录的函数
process_directory() {
  local dir="$1"
  
  echo "Processing directory: $dir"
  
  # 处理当前目录中的文件
  find "$dir" -maxdepth 1 -type f | while read -r file; do
    process_file "$file"
  done
  
  # 如果启用递归模式，处理子目录
  if [[ "$RECURSIVE" == true ]]; then
    find "$dir" -mindepth 1 -maxdepth 1 -type d | while read -r subdir; do
      process_directory "$subdir"
    done
  fi
}

# 开始处理
start_time=$(date +%s)
echo "Starting file processing..."
echo "开始时间: $(date)"
echo "Target directory: $TARGET_DIR"
echo "Recursive mode: $RECURSIVE"
echo "Prefix format: PFX_YYYYMMDDHHMMSS_XXXXXXXX_"
echo "----------------------------------------"

process_directory "$TARGET_DIR"

echo "----------------------------------------"
end_time=$(date +%s)
duration=$((end_time - start_time))
echo "File processing completed!"
echo "处理耗时: ${duration}秒"